/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica.cliente;

import datos.guardararchivo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import java.net.UnknownHostException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import logica.cliente.Usuario;
import presentacion.Chat;
import presentacion.MensajeGlobal;


/**
 *
 * @author abel
 */
public class ClienteRMIimplementor extends UnicastRemoteObject
	implements ClienteRMIinterface {
    private Chat principal;
    private guardararchivo ga= new guardararchivo();

   public ClienteRMIimplementor(Chat principal) throws RemoteException {
        super();
        this.principal=principal;
        
    }
   
   
    
    
    
    
    
    
    
    public String prueba() throws RemoteException{
        return "taran! se envia algo por aqui";
    }
    public boolean ejecutar(/*Nodo nodo*/)throws RemoteException 
    {
         System.out.println("funciono RMI");   
         return true;
    }
    //entrar a una sala
    public void entraraunasala(Usuario usuario) throws RemoteException{
        try {
            ga.guardaripsala(usuario);
           // ga.mostrarmensajeguardados(usuario);
            if (!ga.obtenerservidorderespaldo().equals(ga.obtenermidireccionip()))
            {ga.respaldarip(usuario);}
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    //salir de una sala
    public void salirdeunasala(Usuario usuario) throws RemoteException{
        
            try {
                ga.salirdelasala(usuario);
            } catch (IOException ex) {
                Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
            }
            if (!ga.obtenerservidorderespaldo().equals(ga.obtenermidireccionip()))
                    {ga.respaldarip(usuario);}
        
    }
    //guarda el mensaje en la maquina de respaldo
    public void escribirmensajederespaldo(Usuario usuario) throws RemoteException{
        try {
            ga.guardarmensajerespaldo(usuario);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    //guardar el mensaje en el servidor
    public void escribirmensaje(Usuario usuario) throws RemoteException
    {
        try {
            ga.guardarmensaje(usuario);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    
    //Se recive el mensaje del cliente que trabaja como servidor y se muestra en pantalla
    public void mostramensajermi(Usuario usuario)throws RemoteException
    {
      principal.mostrarmensajes(usuario);
     
    }
    
    public void mostrarmensajermiguardados(Usuario usuario) throws RemoteException
    {
        ga.mostrarmensajeguardados(usuario);
    }
    
    public void mostrarmensajermi2(Usuario usuario) throws RemoteException
    {
        principal.mostrarmensaje2(usuario);
        
    }
    //cambia de sala
     public void cambiodesala(Usuario usuario) throws RemoteException
     {
         /*try {
            ga.guardaripsala(usuario);
            if (ga.obtenerservidorderespaldo()!=InetAddress.getLocalHost().getHostAddress())
            {ga.respaldarip(usuario);}
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        }*/
         
     }
     //mensaje que envia el cliente que se da cuenta si el servidor esta caido a los mayores que el para saber sie stan activo
     public void estasactivo() throws RemoteException
     {
                  ga.grandulon();
                  
                 
     }
     
     public void convertirseenservidor() throws RemoteException{
         principal.convertirservidor();
     }
     
     public void llenarsalaservidor(Usuario usuario) throws RemoteException {
         
         principal.llenarlistacontactos("sala"+Integer.toString(usuario.getSala()));
     }
     //guarda la ip del servidor de respaldo
     public void guardaripservidorderespaldo (Usuario usuario) throws RemoteException
     {
         try {
            ga.guardaripservidorderespaldo(usuario.getDireccionIP());
        } catch (IOException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        }
     
     }
     //intercambia la ip del servidor principal por la de respaldo
     public void usarservidorderespaldo() throws RemoteException{
        try {
            ga.guardaripservidor(ga.obtenerservidorderespaldo());
        } catch (IOException ex) {
            Logger.getLogger(ClienteRMIimplementor.class.getName()).log(Level.SEVERE, null, ex);
        }
     }
     
     public void eliminarip(Usuario usuario) throws RemoteException{
        
            ga.eliminararchivoip(usuario);
       
     
     }
     public void borrardatosinterfaz() throws RemoteException{
         principal.borrarinformacion();
     }
     
     public void eliminarmensaje(Usuario usuario) throws RemoteException{
         ga.eliminararchivomensajes(usuario);
     }
     
    
}
